package org.manager.generic.Repository;


import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.LockMode;
import org.hibernate.criterion.DetachedCriteria;


public interface GenericRepository<T extends Serializable> {

	//---------------基本检索、增加、修改、删除操作 OID-------------
	
	 /**
	  * 根据主键获取实体。如果没有相应的实体，返回 null。
	  * @param id 主键
	  * @return 实体
	  */
    public T get(Serializable id);

    /**
     * 根据主键获取实体并加锁。如果没有相应的实体，返回 null。
     * @param id 主键
     * @param lock 锁模式
     * @return 实体
     */
    public T getWithLock(Serializable id, LockMode lock);

    /**
     * 根据主键获取实体。如果没有相应的实体，抛出异常。
     * @param id 主键
     * @return 实体
     */
    public T load(Serializable id);

    /**
     * 根据主键获取实体并加锁。如果没有相应的实体，抛出异常。
     * @param id 主键
     * @param lock 锁模式
     * @return 实体
     */
    public T loadWithLock(Serializable id, LockMode lock);

    /**
     * 获取全部实体。
     * @return 实体列表
     */
    public List<T> loadAll();

    /**
     * 更新实体
     * @param entity 新实体
     */
    public void update(T entity);

    /**
     * 更新实体并加锁
     * @param entity 新实体
     * @param lock 锁模式
     */
    public void updateWithLock(T entity, LockMode lock);

    /**
     * 存储实体到数据库
     * @param entity 待持久化实体
     */
    public Serializable save(T entity);

    /**
     * 增加或更新实体
     * @param entity 待持久化或更新的实体
     */
    public void saveOrUpdate(T entity);

    /**
     * 增加或更新集合中的全部实体
     * @param entities 实体集合
     */
    public void saveOrUpdateAll(Collection<T> entities);

    /**
     * 删除指定的实体
     * @param entity 待删除的实体
     */
    public void delete(T entity);

    /**
     * 加锁并删除指定的实体
     * @param entity 待删除的实体
     * @param lock 锁模式
     */
    public void deleteWithLock(T entity, LockMode lock);

    /**
     * 根据主键删除指定实体
     * @param id 待删除实体主键
     */
    public void deleteByKey(Serializable id);

    /**
     * 根据主键加锁并删除指定的实体
     * @param id 待删除实体主键
     * @param lock 锁模式
     */
    public void deleteByKeyWithLock(Serializable id, LockMode lock);

    /**
     * 删除集合中的全部实体
     * @param entities 待删除实体集合
     */
    public void deleteAll(Collection<T> entities);
    
    
    //---------------------------HQL---------------------------
    
    /**
     * 使用HSQL语句直接增加、更新、删除实体
     * @param queryString HSQL语句
     */
    public int bulkUpdate(String queryString);

    /**
     * 使用带参数的HSQL语句增加、更新、删除实体
     * @param queryString HSQL语句
     * @param values 参数数组
     * @return 更新行数
     */
    public int bulkUpdate(String queryString, Object[] values);

    /**
     * 使用HSQL语句检索数据
     * @param queryString HSQL语句
     * @return 实体列表
     */
    public List<T> find(String queryString);

    /**
     * 使用带参数的HSQL语句检索数据
     * @param queryString HSQL语句
     * @param values 参数数组
     * @return 实体列表
     */
    public List<T> find(String queryString, Object[] values);

    /**
     * 使用带命名的参数的HSQL语句检索数据
     * @param queryString HSQL语句
     * @param paramNames 参数名称数组
     * @param values 参数值数组
     * @return 实体列表
     */
    public List<T> findByNamedParam(String queryString, String[] paramNames,
            Object[] values);

    /**
     * 使用命名的HSQL语句检索数据
     * @param queryName HSQL语句名称
     * @return 实体列表
     */
    public List<T> findByNamedQuery(String queryName);

    /**
     * 使用带参数的命名HSQL语句检索数据
     * @param queryName HSQL名称
     * @param values 参数数组
     * @return 实体列表
     */
    public List<T> findByNamedQuery(String queryName, Object[] values);

    /**
     * 使用带命名参数的命名HSQL语句检索数据
     * @param queryName HSQL名称
     * @param paramNames 参数名称数组
     * @param values 参数值数组
     * @return 实体列表
     */
    public List<T> findByNamedQueryAndNamedParam(String queryName,
            String[] paramNames, Object[] values);

    /**
     * 使用HSQL语句检索数据，返回 Iterator
     * @param queryString HSQL语句
     * @return 实体集合的迭代
     */
    public Iterator<T> iterate(String queryString);

    /**
     * 使用带参数HSQL语句检索数据，返回 Iterator
     * @param queryString HSQL语句
     * @param values 参数数组
     * @return 实体集合的迭代
     */
    public Iterator<T> iterate(String queryString, Object[] values);

    /**
     * 关闭检索返回的 Iterator
     * @param it 迭代
     */
    public void closeIterator(Iterator<T> it);
    
    
    //---------------------QBC-----------------------
    
    /**
     * 创建与会话无关的检索标准对象
     * @return 检索标准？
     */
    public DetachedCriteria createDetachedCriteria();

    /**
     * 创建与会话绑定的检索标准对象
     * @return 检索标准
     */
    public Criteria createCriteria();

    /**
     * 使用指定的检索标准检索数据
     * @param criteria 检索标准
     * @return 实体列表
     */
    public List<T> findByCriteria(DetachedCriteria criteria);

    /**
     * 使用指定的检索标准检索数据，返回部分记录
     * @param criteria 检索标准
     * @param firstResult 首行
     * @param maxResults 步长
     * @return 实体列表
     */
    public List<T> findByCriteria(DetachedCriteria criteria, int firstResult,
            int maxResults);

    /**
     * 使用指定的实体及属性检索（满足除主键外属性＝实体值）数据
     * @param entity 携带检索数据的实体
     * @param propertyNames 属性数组
     * @return 实体列表
     */
    public List<T> findEqualByEntity(T entity, String[] propertyNames);

    /**
     * 使用指定的实体及属性(非主键)检索（满足属性 like 串实体值）数据
     * @param entity 携带检索数据的实体
     * @param propertyNames 属性数组
     * @return 实体列表
     */
    public List<T> findLikeByEntity(T entity, String[] propertyNames);
    
    
    
    /**
     * 对实体内的String字段进行like运算，且忽略String类型大小写。
     * @param entity 携带查询条件的实体。
     * @return 实体列表
     */
    public List<T> findLikeByEntity(T entity);
    
    /**
     * 使用指定的检索标准检索数据，返回指定范围的记录
     * @param criteria 检索标准
     * @return 符合标准行数
     */
    public Integer getRowCount(DetachedCriteria criteria);

    /**
     * 使用指定的检索标准检索数据，返回指定统计值
     * @param criteria 检索标准
     * @param propertyName 参数名称
     * @param StatName (max,min,avg,sum)
     * @return 统计结果
     */
    public Object getStatValue(DetachedCriteria criteria, String propertyName,
            String StatName);
    
    


    //---------------------其他---------------------------
    
    /**
     * 加锁指定的实体
     * @param entity 实体
     * @param lockMode 锁模式
     */
    public void lock(T entity, LockMode lockMode);

    /**
     * 强制初始化指定的实体
     * @param proxy 持久化对象代理
     */
    public void initialize(Object proxy);

    /**
     * 强制立即更新缓冲数据到数据库（否则仅在事务提交时才更新）
     */
    public void flush();

    /**
     * 查看目前缓存命中率.
     */
    public void checkSessionFactoryStatus();


}
